#ifndef LOG_CLIENT_H
#define LOG_CLIENT_H

#include <string>
#include <vector>
#include <mutex>
#include <thread>
#include <queue>
#include <atomic>
#include <functional>
#include <condition_variable>
#include <QWebSocket>
#include <QObject>
#include <QTimer>
#include <QUrl>

// 日志级别枚举
enum class LogLevel {
    DEBUG,      // 调试
    INFO,       // 信息
    WARNING,    // 警告
    LOG_ERROR,  // 错误
    EXCEPTION,  // 异常
    EMERGENCY   // 紧急
};

// 日志条目结构定义
struct LogEntry {
    LogLevel level;           // 日志级别
    std::string module;       // 模块名称
    std::string message;      // 日志消息
    std::string timestamp;    // 时间戳（可选，服务器会添加）
    std::string deviceId;     // 设备ID
    std::string sessionId;    // 会话ID（可选）
};

// 日志客户端类
class LogClient : public QObject {
    Q_OBJECT
public:
    // 单例模式获取实例
    static LogClient& getInstance();

    // 初始化WebSocket连接
    bool initialize(const std::string& serverUrl);

    // 关闭连接并清理资源
    void shutdown();

    // 发送日志
    void log(LogLevel level, const std::string& module, const std::string& message);

    // 快捷日志方法
    void debug(const std::string& module, const std::string& message);
    void info(const std::string& module, const std::string& message);
    void warning(const std::string& module, const std::string& message);
    void error(const std::string& module, const std::string& message);
    void exception(const std::string& module, const std::string& message);
    void emergency(const std::string& module, const std::string& message);

    // 设置连接状态回调
    void setConnectionCallback(std::function<void(bool)> callback);

    // 检查连接状态
    bool isConnected() const;

    // 设置自动重连
    void setAutoReconnect(bool autoReconnect, int reconnectIntervalMs = 5000);
    
    // 设置设备ID
    void setDeviceId(const std::string& deviceId);
    
    // 设置会话ID
    void setSessionId(const std::string& sessionId);
    
    // 获取当前设备ID
    std::string getDeviceId() const;
    
    // 获取当前会话ID
    std::string getSessionId() const;

private:
    // 私有构造函数（单例模式）
    LogClient();
    ~LogClient();

    // 禁止复制和赋值
    LogClient(const LogClient&) = delete;
    LogClient& operator=(const LogClient&) = delete;

    // 连接到WebSocket服务器
    bool connect();

    // 断开连接
    void disconnect();

    // 发送线程函数
    void sendThreadFunc();
    
    // 重连线程函数
    void reconnectThreadFunc();
    
    // 发送设备注册消息
    void sendDeviceRegistration();
    
    // 将日志条目转换为JSON字符串
    std::string logEntryToJson(const LogEntry& entry);

private slots:
    // QWebSocket信号处理槽
    void onConnected();
    void onDisconnected();
    void onTextMessageReceived(const QString &message);
    void onError(QAbstractSocket::SocketError error);
    void onReconnectTimer();

private:
    // 成员变量
    QWebSocket* webSocket;
    std::string serverUrl;
    std::atomic<bool> connected;
    std::atomic<bool> running;
    
    // 线程相关
    std::thread sendThread;
    
    // 队列相关
    std::queue<LogEntry> logQueue;
    std::mutex queueMutex;
    std::condition_variable queueCondition;

    // 重连设置
    bool autoReconnect;
    int reconnectIntervalMs;
    QTimer* reconnectTimer;

    // 连接回调函数
    std::function<void(bool)> connectionCallback;
    
    // 设备ID和会话ID
    std::string deviceId;
    std::string sessionId;
    mutable std::mutex deviceMutex;  // 保护设备ID和会话ID的互斥锁
};

// 宏定义，方便使用
#define LOG_DEBUG(module, message) LogClient::getInstance().debug(module, message)
#define LOG_INFO(module, message) LogClient::getInstance().info(module, message)
#define LOG_WARNING(module, message) LogClient::getInstance().warning(module, message)
#define LOG_ERROR(module, message) LogClient::getInstance().error(module, message)
#define LOG_EXCEPTION(module, message) LogClient::getInstance().exception(module, message)
#define LOG_EMERGENCY(module, message) LogClient::getInstance().emergency(module, message)

#endif // LOG_CLIENT_H